#include "comfun.h"

u8 checksum(const void *data, u16 len)
{
    u8 cs = 0;

    while (len-- > 0)
        cs += *((u8 *) data + len);
    return cs;
}


void os_memcpy(void *dst, const void *src, u16 len)
{
    while (len--)
    {
        *((u8 *) dst + len) = *((const u8 *)src + len);
    }
}

u8 os_memcmp(const void *s1, const void *s2, u16 n)
{
    while (n--)
    {
        if (*((u8 *) s1 + n) != *((u8 *) s2 + n))
            return 1;
    }
    return 0;
}

void os_memset(void *s1, u8 val, u16 len)
{
    while (len--)
    {
        *((u8 *) s1 + len) = val;
    }
}

u8 is_all_xx(const void *s1, u8 val, u16 n)
{
    while (n && *(u8 *) s1 == val)
    {
        s1 = (u8 *) s1 + 1;
        n--;
    }
    return !n;
}

/*
u8 is_all_bcd(const void *s1, u8 len)
{
    while (len--)
    {
        if (get_bits(*(u8*)s1, 0, 3) > 9) return 0;
        if (get_bits(*(u8*)s1, 4, 7) > 9) return 0;
    }
    return 1;
}
*/

u32 get_le_val(const u8 * p, u8 bytes)
{
    u32 ret = 0;

    while (bytes-- > 0)
    {
        ret <<= 8;
        ret |= *(p + bytes);
    }
    return ret;
}

void put_le_val(u32 val, u8 * p, u8 bytes)
{
    while (bytes-- > 0)
    {
        *p++ = val & 0xFF;
        val >>= 8;
    }
}

void * os_memmove(void *dest, const void *src, u16 n)
{
    s8 *ret = (s8 *) dest;

    if (ret <= (s8 *) src || ret >= (s8 *) src + n)
    {
        while (n--)
        {
            *ret++ = *(s8 *) src;
            src = (s8 *) src + 1;
        }
    }
    else
    {
        ret += n - 1;
        src = (s8 *) src + n - 1;
        while (n--)
        {
            *ret-- = *(s8 *) src;
            src = (s8 *) src - 1;
        }
    }
    return dest;
}


